//
//  HBOauthViewModel.swift
//  sinaWeibo
//
//  Created by Beans on 16/6/25.
//  Copyright © 2016年 iceWorks. All rights reserved.
//

import UIKit

/** MVVM的原则:
 1. view和ViewController结合在了一起
 2. view和ViewController不能喝Model进行交互, 需要和viewModel进行交互
 3. viewModel对上需要的View和ViewController交互, 对下需要和Model交互
 
 viewModel放哪些东西?
 1. 和Model打交道
 2. 所有网络请求需要放在这里
 3. 对数据的处理
*/

class HBOauthViewModel: NSObject {

    // 定义为单例, 方便外界调用, 同时返回的数据指向同一块内存区域
    static let shareInstance: HBOauthViewModel = HBOauthViewModel()

    // 第一次赋值 -- 网络请求时
    // 第二次赋值 -- 读取解档方法
    var userModel: HBUserModel?

    // 把是否登录的逻辑放在viewModel
    var isLogin: Bool {
        return userModel?.access_token == nil ? false : true
    }

    // 直接把userModel的属性access_token放在viewModel中, 方便用户调用
    var access_token: String? {
        return userModel?.access_token
    }

    // 初始化方法里, 给model赋值
    override init() {
        userModel = HBUserModel.readUserInfo()
        super.init()    // 默认调用, 推荐写上
    }

    // MARK: - 用code来获取token
    func loadToken(code: String, success: ()->(), failure: ()->()) {
        /*
        必选	类型及范围	说明
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code

        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        */
        // 发送请求
        let params = [
            "client_id" : AppKey,
            "client_secret" : AppSecret,
            "grant_type" : "authorization_code",
            "code" : code,
            "redirect_uri": AppRedirectURL
        ]

        /*
        status code: 404 -- 网址错误,到不到
        status code: 405
        */
        HBHTTPClient.shareInstance.request(.POST, URLString: "https://api.weibo.com/oauth2/access_token", parameters: params, success: { (JSON) -> Void in
//            printLog(JSON)

            // 问题: AnyObject? 可选项, 不能放在字典里. 进行转换
            guard let jsonDict = JSON as? [String: AnyObject] else {
                return
            }
            let model = HBUserModel(dict: jsonDict)
//            printLog(model)

            // 调用方法获取用户数据 (闭包中调用方法需使用self)
            self.loadUserInfo(model, infoSuccess: success, infoFailure: failure)

            }) { (error) -> Void in
                printLog(error)

                failure()
        }
    }

    /*
    access_token	用于调用access_token，接口获取授权后的access token
    expires_in	access_token的生命周期，单位是秒数
    remind_in	access_token的生命周期（该参数即将废弃，开发者请使用expires_in）
    uid	当前授权用户的UID
    */
    // MARK: - 通过token获取用户信息
    private func loadUserInfo(model: HBUserModel, infoSuccess: ()->(), infoFailure: ()->()) {
        // 字典需要填非可选类型
        guard let access_token = model.access_token, uid = model.uid else {
            return
        }
        let params = [
            "access_token" : access_token,
            "uid" : uid
        ]

        HBHTTPClient.shareInstance.request(.GET, URLString: "https://api.weibo.com/2/users/show.json", parameters: params, success: { (JSON) -> Void in
//            printLog(JSON)

            // JSON -> dict
            guard let jsonDict = JSON as? [String: AnyObject] else {
                return
            }

            // 获取用户昵称和头像
            model.name = jsonDict["name"] as? String
            model.avatar_large = jsonDict["avatar_large"] as? String
//            printLog("\(model.name), \(model.avatar_large)")

            // 网络请求成功后, 赋值给model
            self.userModel = model  // 授权后, 只走一次

            // 归档
            model.saveUserInfo()

            infoSuccess()

            }) { (error) -> Void in
                printLog(error)
                infoFailure()
        }
    }

}
